package app

import (
	"mallgo/internal/common/response"
	"mallgo/internal/resources/app/api/domain/request"
	"mallgo/internal/resources/app/resource"
	"strconv"

	"github.com/gin-gonic/gin"
)

type AppController struct {
	appResource *resource.AppResource
}

func NewAppController(appResource *resource.AppResource) *AppController {
	return &AppController{
		appResource: appResource,
	}
}

// Create 创建应用
// @Summary 创建应用
// @Description 创建新的应用
// @Tags 应用管理
// @Accept json
// @Produce json
// @Param data body model.AppRequest true "应用信息"
// @Success 200 {object} response.ResponseObject
// @Router /api/app [post]
func (a *AppController) Create(c *gin.Context) {
	var req request.AppRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(200, response.Error(501, "请求参数错误"))
		return
	}
	c.JSON(200, a.appResource.Create(&req))
}

// Update 更新应用
// @Summary 更新应用
// @Description 更新指定ID的应用信息
// @Tags 应用管理
// @Accept json
// @Produce json
// @Param id path int true "应用ID"
// @Param data body model.AppRequest true "应用信息"
// @Success 200 {object} response.ResponseObject
// @Router /api/app/{id} [put]
func (a *AppController) Update(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		response.Error(400, "无效的ID").ToJSON(c)
		return
	}

	var req request.AppRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		response.Error(400, "请求参数错误").ToJSON(c)
		return
	}

	a.appResource.Update(id, &req).ToJSON(c)
}

// Delete 删除应用
// @Summary 删除应用
// @Description 删除指定ID的应用
// @Tags 应用管理
// @Accept json
// @Produce json
// @Param id path int true "应用ID"
// @Success 200 {object} response.ResponseObject
// @Router /api/app/{id} [delete]
func (a *AppController) Delete(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		response.Error(400, "无效的ID").ToJSON(c)
		return
	}

	a.appResource.Delete(id).ToJSON(c)
}

// Get 获取应用详情
// @Summary 获取应用详情
// @Description 获取指定ID的应用详细信息
// @Tags 应用管理
// @Accept json
// @Produce json
// @Param id path int true "应用ID"
// @Success 200 {object} response.ResponseObject
// @Router /api/app/{id} [get]
func (a *AppController) Get(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		response.Error(400, "无效的ID").ToJSON(c)
		return
	}

	a.appResource.Get(id).ToJSON(c)
}

// Query 查询应用列表
// @Summary 查询应用列表
// @Description 查询应用列表，支持分页和条件查询
// @Tags 应用管理
// @Accept json
// @Produce json
// @Param app_key query string false "应用Key"
// @Param name query string false "应用名称"
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Success 200 {object} response.ResponseObject
// @Router /api/app [get]
func (a *AppController) Query(c *gin.Context) {
	var req request.AppRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		response.Error(400, "请求参数错误").ToJSON(c)
		return
	}

	a.appResource.Query(&req).ToJSON(c)
}
